/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VentanaPrincipal.java
 *
 * Created on 28/04/2012, 07:06:33 PM
 */
package Grafico;

import Interfaz.*;
import Mundo.*;
import Personajes.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.JOptionPane;
import IA.*;
import Objetos.*;
import java.awt.image.*;
import java.io.File;
import javax.imageio.ImageIO;
import javax.sound.sampled.*;

public class Ventana_principal extends JFrame {

    private int clickX;
    private int clickY;
    private int clickDX;
    private int clickDY;
    public boolean turnoTerminado = false;
    public boolean imprimeAtaca = false;
    public boolean imprimeAtacado = false;
    private Batallon batallonResumen;
    public boolean dibujarMapa = false;
    //public boolean dibujarobjetivo = true;
    private int a;
    private int b;
    private boolean movimiento = false;
    private boolean mostrarMenu = false;
    private int ig;
    private int jg;
    private int num_mov;
    private int[] datosMapa = new int[4];
    private Batallon batallonActivo;
    private Mapa mapa;
    private Dibujador dib;
    private ArrayList<Ejercito> ejercitos;
    private transient ArrayList<Objetivo> objetivos;
    private boolean dibujarResumenes = false;
    private transient IA ia;
    private ArrayList<Aldea> aldeas;
    private String mensaje_extra;
    private boolean imprimerequest;
    public Juego juego;
    private BufferStrategy strategy;
    private Canvas2 canvas;
    private boolean painting = false;
    private Comprobadores comprobadores;
    ArrayList<ArrayList<Integer>> recogido;
    private javax.swing.Timer delay;
    private javax.swing.Timer curador;

    private class Canvas2 extends Canvas {

        @Override
        public void paint(Graphics g) {
            Ventana_principal.this.dibuja();
        }
    }

    public void creaComprobadores() {
        comprobadores = new Comprobadores();
        comprobadores.setDaemon(true);
        comprobadores.start();
    }

    class Comprobadores extends Thread {

        public void compruebaGanar() {
            Ventana_principal.this.ejercitos.get(0).verifica_batallones(Ventana_principal.this.mapa);
            //if (Ventana_principal.this.batallonActivo.isMuerto()) {
            //  Ventana_principal.this.batallonActivo = getNuevoBatActivo(Ventana_principal.this.ejercitos.get(0));
            //}
            Ventana_principal.this.ejercitos.get(1).verifica_batallones(Ventana_principal.this.mapa);
            boolean ganaste = comprueba_objetivos();
            if (ganaste) {
                JOptionPane.showMessageDialog(null, "You are victorious!");
                dispose();
                System.exit(0);
            }

        }

        public boolean comprueba_objetivos() {

            String mensaje = null;

            for (int i = 0; i < Ventana_principal.this.objetivos.size(); i++) {

                if (i == 0) {
                    mensaje = "Hemos derrotado al enemigo, felicidades. Objetivo cumplido\n\n";
                }
                if (i == 1) {
                    mensaje = "Has salvado a los nativos y se han unido a tu causa.\n\nObjetivo 2 cumplido.\n\n";
                }
                if (i == 2) {
                    mensaje = "Terminaste con los batallones realistas de estas tierras, es hora de seguir adelante\n\nObjetivo 3 cumplido.\n\n";
                }
                if (i == 3) {
                    mensaje = "Nativo: He visto fusileros realistas cerca de aqui, ten cuidado en los techos\n\nObjetivo 4 cumplido.\n\n";
                }
                if (i == 4) {
                    mensaje = "¡Bien hecho! acabaste con esos realistas, pero ten cuidado, mas adelante debe haber mas\n\nObjetivo 5 cumplido.\n\n";
                }
                if (i == 5) {
                    mensaje = "¡Mira eso!hay varios nativos para reclutar, muchos tienen armas muy fuertes y estan listos para la batalla\n\nObjetivo 6 cumplido.\n\n";
                }
                if (i == 6) {
                    mensaje = "Has llegado al final de tu mision, ya con esto has cambiado la historia\n Ahora preparate\n\nObjetivo 7 cumplido.\n\n";
                }
                if (i == 7) {
                    mensaje = "¡Solo quedan dos! Los realistas estan callendo como moscas\n Se que el cansancio es increible, pero continua\nLucha por tu patria...¡Al ataque! \n\nObjetivo 8 cumplido.\n\n";
                }
                if (i == 8) {
                    mensaje = "Los realistas estan acabados, solo queda su cobarde alcalde\nEs hora de acabar con su vil gestion\n\nObjetivo 9 cumplido.\n\n";
                }
                if (i == 9) {
                    mensaje = "¡Felicidades! Has triunfado en tu dura misión\nAun queda mucho por delante pero con tu espiritu triunfaras.\n\nObjetivo 10 cumplido.\n\n";
                }
                Batallon[] bat_en_obj;
                int flag_set = 0;
                if (!Ventana_principal.this.objetivos.get(i).is_cumplido()) {
                    if (flag_set == 0) {
                        bat_en_obj = Ventana_principal.this.objetivos.get(i).get_bat_muer();
                        Ventana_principal.this.ia.set_batobj(bat_en_obj);
                        flag_set = 1;
                    }

                    Ventana_principal.this.objetivos.get(i).comprueba_objetivo(mensaje, Ventana_principal.this);
                    if (i == 9 && Ventana_principal.this.objetivos.get(i).is_cumplido()) {
                        return true;
                    }
                    return false;
                }
            }
            if (Ventana_principal.this.objetivos.get(9).is_cumplido()) {
                return true;
            }
            return false;
        }

        public void compruebaPerder() {
            Ventana_principal.this.ejercitos.get(0).verifica_batallones(Ventana_principal.this.mapa);
            if (Ventana_principal.this.batallonActivo.isMuerto()) {
                Ventana_principal.this.batallonActivo = getNuevoBatActivo(Ventana_principal.this.ejercitos.get(0));
            }
            Ventana_principal.this.ejercitos.get(1).verifica_batallones(Ventana_principal.this.mapa);

            boolean perdiste = true;
            for (int z = 0; z < Ventana_principal.this.ejercitos.get(0).getCant_batallones(); z++) {

                perdiste = perdiste && Ventana_principal.this.ejercitos.get(0).getBatallones().get(z).isMuerto();

            }

            if (perdiste) {
                JOptionPane.showMessageDialog(null, "Ha perdido...");

                dispose();
                System.exit(0);
            }
        }

        @Override
        public void run() {
            while (true) {
                compruebaGanar();
                comprueba_objetivos();
                compruebaPerder();
                try {
                    sleep(250);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Ventana_principal.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    public BufferStrategy getCanvasStrategy() {
        return canvasStrategy;
    }
    private BufferStrategy canvasStrategy;

    public Juego getJuego() {
        return juego;
    }

    public void set_Batallon_Activo(Batallon bat) {
        this.batallonActivo = bat;

    }

    public Batallon get_Batallon_Activo() {

        return this.batallonActivo;
    }

    public void setJuego(Juego juego) {
        this.juego = juego;
    }
    //private Juego juego;

    public ArrayList<Aldea> getAldeas() {
        return aldeas;
    }

    public void setAldeas(ArrayList<Aldea> aldeas) {
        this.aldeas = aldeas;
    }

    public void setClickDX(int clickDX) {
        this.clickDX = clickDX;
    }

    public void setClickDY(int clickDY) {
        this.clickDY = clickDY;
    }

    public int getClickDX() {
        return this.clickDX;
    }

    public int getClickDY() {
        return this.clickDY;
    }

    public int revisaAldea(Batallon bat) {
        int num = aldeas.size();
        int x, y, a, b;
        for (int i = 0; i < num; i++) {
            x = aldeas.get(i).getX();
            y = aldeas.get(i).getY();
            a = aldeas.get(i).getA();
            b = aldeas.get(i).getB();
            if (bat.getX() <= x + a + 1 && bat.getX() >= x - a - 1 && bat.getY() <= y + b + 1 && bat.getY() >= y - b - 1) {
                return i;
            }
        }
        return -1;
    }

    private class hilo_recluta extends Thread {

        private int tipo;
        private Batallon bata;
        private Aldea ald;
        private int num;

        public void set_recluta(Batallon bata, Aldea ald, int tipo, int num) {
            this.bata = bata;
            this.ald = ald;
            this.tipo = tipo;
            this.num = num;
        }

        public void run() {
            try {
                int cont = 0;
                if (ald == null) {
                    return;
                }
                for (int i = 0; i < ald.getAldeanos().size(); i++) {
                    if (ald.getAldeanos().get(i).get_tipo() == tipo) {
                        cont++;
                    }
                }
                PopUp p = new PopUp();
                if (cont > num) {
                    sleep(2 * tipo * num * 75);
                } else {
                    sleep(2 * tipo * cont * 75);
                }
                p.m.setText("Reclutado Completo.");
                sleep(500);
                p.dispose();
            } catch (InterruptedException ex) {
            }
            try {
                ald.recluta(bata, tipo, num);
                if (ald.isVacia()) {
                    ald.borraAldea(mapa);
                    aldeas.remove(ald);
                }
            } catch (Exception ex) {
            }

        }
    }

    private void hacer_reclutamiento(Ventana_recluta_aldea a) {
    }

    private class Ventana_recluta_aldea extends /*JFrame*/ JDialog {

        protected Aldea aldea;
        Batallon bat;
        JTextField cantidades[];
        int aceptado = 0;

        public Ventana_recluta_aldea(Ventana_principal owner, Aldea ald, Batallon bat) {
            super(owner, true);

            this.aldea = ald;
            this.bat = bat;
            this.setLocation(100, 100);
            this.setTitle("Reclutar");
            String[] detalle = ald.forma_detalle();
            cantidades = new JTextField[detalle.length];

            Container cp = getContentPane();
            cp.setLayout(new FlowLayout());
            int i;

            cp.add(new JLabel("Elija a quienes desea reclutar"));

            for (i = 0; i < detalle.length; i++) {

                JLabel etiqueta = new JLabel(detalle[i]);
                etiqueta.setLocation(5, 20 + i * 10);
                JTextField texto = new JTextField(5);
                texto.setSize(20, 20);
                texto.setLocation(10 + etiqueta.getWidth() + 20, 20 + i * 10);
                cp.add(etiqueta);
                cp.add(texto);
                cantidades[i] = texto;
            }
            this.setSize(250, i * 100 + 50);

            JButton aceptar = new JButton("Aceptar");

            aceptar.setLocation(5, i * 10 + 25);

            JButton cancelar = new JButton("Cancelar");

            cancelar.setLocation(10 + aceptar.getWidth() + 20, 20 + i * 10 + 25);

            cancelar.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Ventana_recluta_aldea.this.dispose();
                }
            });

            aceptar.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    int[] numxtipos = Ventana_recluta_aldea.this.getaldea().getcantxtipos();
                    JTextField[] cantidades = Ventana_recluta_aldea.this.get_textos();
                    Batallon recibe = Ventana_recluta_aldea.this.get_bata();

                    int cant = numxtipos.length;
                    int sgte = 0;

                    int[] recxtipos = new int[cant];

                    for (int i = 0; i < cant; i++) {

                        if (numxtipos[i] > 0) {
                            int num = 0;
                            try {
                                num = Integer.parseInt(cantidades[sgte].getText());
                            } catch (Exception ex) {

                                return;
                            }

                            if (num > 0) {

                                hilo_recluta rec = new hilo_recluta();


                                rec.set_recluta(recibe, Ventana_recluta_aldea.this.getaldea(), i, num);
                                rec.setDaemon(true);
                                rec.start();
                            }

                            sgte++;
                        }
                    }

                    Ventana_recluta_aldea.this.dispose();
                }
            });
            this.addWindowListener(new WindowAdapter() {

                @Override
                public void windowClosing(WindowEvent e) {
                    super.windowClosing(e);
                }
            });

            cp.add(aceptar);
            cp.add(cancelar);


            this.setVisible(true);

        }

        public Aldea getaldea() {

            return this.aldea;
        }

        public JTextField[] get_textos() {

            return this.cantidades;
        }

        public Batallon get_bata() {

            return this.bat;
        }
    }

    private class hilo_recluta_nat extends Thread {

        private int tipo;
        private Batallon bata;
        private Batallon nat;
        private int num;

        public void set_recluta_nat(Batallon bata, Batallon nat, int tipo, int num) {


            this.bata = bata;
            this.nat = nat;
            this.tipo = tipo;
            this.num = num;
        }

        public void run() {
            try {
                sleep(2 * tipo * num * 75);
            } catch (InterruptedException ex) {
            }
            try {
                bata.recluta(nat, tipo, num, mapa);
            } catch (Exception ex) {
            }

        }
    }

    private class Ventana_recluta_nativo extends JDialog {

        private Batallon nat;
        private Batallon bat;
        private JTextField cantidades[];

        public Ventana_recluta_nativo(Batallon nat, Batallon bat) {
            super(Ventana_principal.this, true);

            this.nat = nat;
            this.bat = bat;
            this.setLocation(100, 100);
            this.setTitle("Reclutar");
            String[] detalle = nat.obtener_detalle();
            cantidades = new JTextField[detalle.length];

            Container cp = getContentPane();
            cp.setLayout(new FlowLayout());
            int i;

            cp.add(new JLabel("Elija a quienes desea reclutar"));

            for (i = 0; i < detalle.length; i++) {

                JLabel etiqueta = new JLabel(detalle[i]);
                etiqueta.setLocation(5, 20 + i * 10);
                JTextField texto = new JTextField(5);
                texto.setSize(20, 20);
                texto.setLocation(10 + etiqueta.getWidth() + 20, 20 + i * 10);
                cp.add(etiqueta);
                cp.add(texto);
                cantidades[i] = texto;
            }
            this.setSize(250, i * 100 + 50);

            JButton aceptar = new JButton("Aceptar");

            aceptar.setLocation(5, i * 10 + 25);

            JButton cancelar = new JButton("Cancelar");

            cancelar.setLocation(10 + aceptar.getWidth() + 20, 20 + i * 10 + 25);

            this.addWindowListener(new WindowAdapter() {

                @Override
                public void windowClosing(WindowEvent e) {
                    super.windowClosing(e);
                }
            });


            cancelar.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Ventana_recluta_nativo.this.dispose();
                }
            });

            aceptar.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    int[] numxtipos = Ventana_recluta_nativo.this.getnativo().get_tipos();
                    JTextField[] cantidades = Ventana_recluta_nativo.this.get_textos();
                    Batallon recibe = Ventana_recluta_nativo.this.get_bata();

                    int cant = numxtipos.length;
                    int sgte = 0;

                    int[] recxtipos = new int[cant];

                    for (int i = 0; i < cant; i++) {

                        if (numxtipos[i] > 0) {
                            int num = 0;
                            try {
                                num = Integer.parseInt(cantidades[sgte].getText());
                            } catch (Exception ex) {

                                return;
                            }

                            if (num > 0) {

                                hilo_recluta_nat rec = new hilo_recluta_nat();


                                rec.set_recluta_nat(recibe, Ventana_recluta_nativo.this.getnativo(), i, num);
                                rec.setDaemon(true);
                                rec.start();
                            }

                            sgte++;
                        }
                    }

                    Ventana_recluta_nativo.this.dispose();
                }
            });

            cp.add(aceptar);
            cp.add(cancelar);

            this.setVisible(true);
        }

        public Batallon getnativo() {

            return this.nat;
        }

        public JTextField[] get_textos() {

            return this.cantidades;
        }

        public Batallon get_bata() {

            return this.bat;
        }
    }

    private class Pulsar_teclaEsc extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                int opcion;
                opcion = JOptionPane.showOptionDialog(null, "Seguro que desea salir", "Salir del Juego", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (opcion == JOptionPane.OK_OPTION) {
                    System.exit(0);
                }
            }
        }
    }

    private class Click_derecho extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3) {
                clickDX = e.getX();
                clickDY = e.getY();
                Batallon batObj = elegirBatallon('D');
                if (batObj != null && batObj != batallonActivo) {
                    imprimeAtaca = false;
                    imprimeAtacado = false;
                    imprimerequest = false;
                    if (compruebaCercano(batallonActivo, batObj)) {
                        if (batObj.getBando() == 1) {
                            if (!batObj.isMuerto()) {
                                ArrayList<ArrayList<Integer>> aux = ejercitos.get(0).ataca(batallonActivo, batObj);
                                if (aux != null) {
                                    recogido.get(0).addAll(aux.get(0));
                                    recogido.get(1).addAll(aux.get(1));
                                }
                                imprimeAtaca = true;
                                if (batObj.isMuerto()) {
                                    // aqui va la pregunta si quiere recoger
                                    ((QuickIA) Ventana_principal.this.ia).detente();
                                    Ventana_recogerArma v = new Ventana_recogerArma(Ventana_principal.this, true, recogido, Ventana_principal.this.batallonActivo, Ventana_principal.this.ejercitos.get(0), true);
                                    recogido = new ArrayList<ArrayList<Integer>>();
                                    recogido.add(new ArrayList<Integer>());
                                    recogido.add(new ArrayList<Integer>());
                                    ((QuickIA) Ventana_principal.this.ia).sigue();
                                }
                            }
                        } else if (batObj.getBando() == 2) {
                            //ejercitos.get(0).convencer(batallonActivo, batObj, mapa, Ventana_principal.this);

                            Ventana_recluta_nativo v = new Ventana_recluta_nativo(batObj, batallonActivo);


                        } else if (batObj.getBando() == 0) {
                            if (batObj != batallonActivo) {
                                ejercitos.get(0).merge(batObj, batallonActivo, mapa);
                                batallonActivo = batObj;
//                                    dib.setBatallonActivo(batallonActivo);
                            }
                        }
                        turnoTerminado = true;
                        //compruebaGanar();
                        //ia.decide_IA(Ventana_principal.this);
                        //compruebaPerder();

//                            dib.dibuja(mapa);
                    }
                } else {
                    int iAld = revisaAldea(batallonActivo);
                    if (iAld != -1) {
                        ((QuickIA) (ia)).detente();
                        int[] datven = Ventana_principal.this.getdatos();
                        int posXclickD = (clickDX /*- 40*/) / 20 - datven[1] + datven[3];
                        int posYclickD = (clickDY /*- 50*/) / 20 - datven[0] + datven[2] /*- contLineasSobreMapa*/;
                        //calcula la posicion del click en el mapa de acuerdo a los offset de pantalla
                        int x, y, a, b;
                        x = aldeas.get(iAld).getX();
                        y = aldeas.get(iAld).getY();
                        a = aldeas.get(iAld).getA();
                        b = aldeas.get(iAld).getB();
                        if (posXclickD <= x + a && posXclickD >= x - a && posYclickD <= y + b && posYclickD >= y - b) {
                            accionesAldea(iAld);
                        }
                    }
                }
            }

            dibuja();
        }
    }

    private void accionesAldea(int iAld) {
        Aldea ald = aldeas.get(iAld);
        String opciones[] = {"Comprar Armas", "Reclutar Aldeanos"};
        String det = ald.mostrarDetalle();
        int opc = JOptionPane.showOptionDialog(null, det + "Que acción desea realizar", "Aldea " + iAld, JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, opciones, null);
        switch (opc) {
            case 1:
                if (ald.getAldeanos().isEmpty()) {
                    //System.out.println("No hay aldeanos para reclutar");
                    break;
                }
                hilo_recluta recluta = new hilo_recluta();
//                recluta.set_recluta(ejercitos.get(0), batallonActivo, ald, Ventana_principal.this);
                recluta.setDaemon(true);
                recluta.start();
                //ejercitos.get(0).reclutarAldeanos(batallonActivo, ald, mapa, Ventana_principal.this);
                Ventana_recluta_aldea vent = new Ventana_recluta_aldea(this, ald, batallonActivo);
//                if (vent.acepto()==1) hacer_reclutamiento(vent);
                break;
            case 0:
                if (ald.getArmas().isEmpty()) {
                    System.out.println("No hay armas para comprar");
                    break;
                }
                ArrayList<ArrayList<Integer>> aux = new ArrayList<ArrayList<Integer>>();
                aux.add(ald.getArmas());
                aux.add(new ArrayList<Integer>());
                ((QuickIA) (ia)).detente();
                Ventana_recogerArma v = new Ventana_recogerArma(Ventana_principal.this, true, aux, Ventana_principal.this.batallonActivo, Ventana_principal.this.ejercitos.get(0), false);
            //ejercitos.get(0).comprarArmas(batallonActivo, ald, Ventana_principal.this);

        }
        if (ald.isVacia()) {
            ald.borraAldea(mapa);
            aldeas.remove(ald);
            dibuja();
        }
        ((QuickIA) ia).sigue();

    }

    public Ventana_principal() {
        initComponents();
        num_mov = 12;
        this.setSize(1060, 700);
        this.setTitle("La toma del Cuzco");
        this.setVisible(true);
        this.setResizable(false);
        canvas = new Canvas2();
        this.recogido = new ArrayList<ArrayList<Integer>>();
        recogido.add(new ArrayList<Integer>());
        recogido.add(new ArrayList<Integer>());
        //Ventana_recogerArma v = new Ventana_recogerArma(Ventana_principal.this, true);

        this.add(canvas);
        canvas.setBounds(20, 48, 1020, 380);
        canvas.createBufferStrategy(2);
        this.createBufferStrategy(2);
        strategy = this.getBufferStrategy();
        canvasStrategy = canvas.getBufferStrategy();
        Sonido sonido = new Sonido("theme.wav");
        sonido.setDaemon(true);
        sonido.start();
        ActionListener tiempoAcabado = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Ventana_principal.this.delay.stop();
            }
        };
        delay = new javax.swing.Timer(225, tiempoAcabado);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
        canvas.addKeyListener(new Pulsar_teclaEsc());
        canvas.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (delay.isRunning()) {
                    return;
                }
                impresiones_objetivos();
                switch (e.getKeyChar()) {
                    case 'w':
                        batallonActivo.mover(mapa, 0, -1);
                        break;
                    case 's':
                        batallonActivo.mover(mapa, 0, 1);
                        break;
                    case 'd':
                        batallonActivo.mover(mapa, 1, 0);
                        break;
                    case 'a':
                        batallonActivo.mover(mapa, -1, 0);
                        break;
                    case 'q':
                        num_mov = 0;
                        break;
                    case 'c':
                        int iAld = revisaAldea(batallonActivo);
                        if (iAld != -1) {
                            ((QuickIA) (ia)).detente();
                            accionesAldea(iAld);
//                            ((QuickIA) (ia)).sigue();
                        }
                        break;
                    case 'g':
                        ((QuickIA) Ventana_principal.this.ia).detente();
                        juego.set_batallon(batallonActivo);
                        Juego.guardar_juego(juego);
                        ((QuickIA) Ventana_principal.this.ia).sigue();
                        break;
                    default:
                        return;

                }
                imprimeAtaca = false;
                imprimeAtacado = false;
                imprimerequest = false;
                dibuja();
                delay.start();
            }
        });
        canvas.addMouseListener(new Click_derecho());
        canvas.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                int num;
                //impresiones_objetivos();
                num = e.getClickCount();
                if (num == 1) {
                    if (e.getButton() == MouseEvent.BUTTON1) {
                        imprimeAtaca = false;
                        imprimeAtacado = false;
                        clickX = e.getX();
                        clickY = e.getY();
                        Batallon batallonActivoaux = elegirBatallon('I');
                        if (batallonActivoaux != null) {
                            imprimeAtaca = false;
                            imprimeAtacado = false;
                            imprimerequest = false;
                            if (batallonActivoaux.getBando() == 0) {
                                batallonActivo.setActivo(false);
                                batallonActivo = batallonActivoaux;
                                batallonActivo.setActivo(true);
//                                dib.setBatallonActivo(batallonActivoaux);
                                movimiento = true;
                            }
                            batallonResumen = batallonActivoaux;
                            dibujarResumenes = true;
                        } else {
                            int[] datven = Ventana_principal.this.getdatos();
                            //cambios aqui!!
                            int posXclick = (clickX /*- 40*/) / 20 - datven[1] + datven[3];
                            int posYclick = (clickY /*- 50*/) / 20 - datven[0] + datven[2] /*- contLineasSobreMapa*/;
                            //fin cambios
                            //calcula la posicion del click en el mapa de acuerdo a los offset de pantalla
                            if (posXclick > batallonActivo.getX()) {
                                batallonActivo.mover(mapa, 1, 0);
                                if (posYclick > batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, 1);
                                } else if (posYclick < batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, -1);
                                }
                            }
                            if (posXclick < batallonActivo.getX()) {
                                batallonActivo.mover(mapa, -1, 0);
                                if (posYclick > batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, 1);
                                } else if (posYclick < batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, -1);
                                }
                            }
                            if (posXclick == batallonActivo.getX()) {
                                if (posYclick > batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, 1);
                                } else if (posYclick < batallonActivo.getY()) {
                                    batallonActivo.mover(mapa, 0, -1);
                                }
                            }
                            imprimeAtaca = false;
                            imprimeAtacado = false;
                            imprimerequest = false;
                            //compruebaGanar();
                            //ia.decide_IA(Ventana_principal.this);
                            //compruebaPerder();
                        }
                    }
                }
                if (num == 2) {
                    clickX = e.getX();
                    clickY = e.getY();
                    Batallon batallonActivoaux = elegirBatallon('I');
                    if (batallonActivoaux != null) {
                        imprimeAtaca = false;
                        imprimeAtacado = false;
                        imprimerequest = false;
                        if (batallonActivoaux.getBando() == 0) {
                            ejercitos.get(0).dividir_batallon_ventana(mapa, batallonActivoaux, Ventana_principal.this);
                            batallonResumen = batallonActivoaux;
                            dibujarResumenes = true;
                        }
                    }
                }
                dibuja();
            }
        });
        ActionListener tiempoDeCurar = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ejercitos.get(0).cura(Ventana_principal.this);
            }
        };
        curador = new javax.swing.Timer(1000, tiempoDeCurar);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, Short.MAX_VALUE));

        pack();
    }// </editor-fold>
    /**
     * @param args the command line arguments
     */
    private boolean imprimirObj = false;
    private String cadObj;

    public void setImprimirObj(boolean imprimirObj) {
        this.imprimirObj = imprimirObj;
    }

    public void setCadObj(String cadObj) {
        this.cadObj = cadObj;
    }

    public void setIA(IA ia) {
        this.ia = ia;
    }

    public ArrayList<Objetivo> getObjetivos() {
        return objetivos;
    }

    public void setObjetivos(ArrayList<Objetivo> objetivos) {
        this.objetivos = objetivos;
    }

    public void setMostrarMenu(boolean mostrarMenu) {
        this.mostrarMenu = mostrarMenu;
    }

    public void setMovimiento(boolean movimiento) {
        this.movimiento = movimiento;
    }

    public void setDibujarResumenes(boolean dibujarResumenes) {
        this.dibujarResumenes = dibujarResumenes;
    }

    public void setDibujador(Dibujador dib) {
        this.dib = dib;
    }

    public void imprime(String mensaje) {
        this.imprimerequest = true;
        this.mensaje_extra = mensaje;
//        update(this.getGraphics());
        dibuja();
    }

    public String obtenvalor(String mensaje) {

        return JOptionPane.showInputDialog(null, mensaje);

    }

    public void setEjercitos(ArrayList<Ejercito> ejercitos) {
        this.ejercitos = ejercitos;
    }

    public void setA(int a) {
        this.a = a;
    }

    public void setB(int b) {
        this.b = b;
    }

    public void setBatallonActivo(Batallon batallonActivo) {
        this.batallonActivo = batallonActivo;
    }

    public void setMapa(Mapa mapa) {
        this.mapa = mapa;
    }
    private int contLineasSobreMapa;

    public synchronized void dibuja() {
        //if (painting) {
        //return;
        //}
        //painting = true;
        ig = 0;
        jg = 0;
        contLineasSobreMapa = 0;
        try {
            Graphics2D graphics = (Graphics2D) strategy.getDrawGraphics();
            Graphics2D graphicsCanvas = (Graphics2D) canvasStrategy.getDrawGraphics();
            super.paint(graphics);
            //super.paint(graphicsCanvas);
            if (imprimirObj) {
                dibujaObj(graphics);
                BufferedImage fondo = null;
                BufferedImage controles = null;
                try {
                    fondo = ImageIO.read(new File("pergamino.png"));
                    controles = ImageIO.read(new File("controles.png"));
                } catch (IOException ex) {
                    Logger.getLogger(Ventana_principal.class.getName()).log(Level.SEVERE, null, ex);
                }
//g.drawImage(fondo, 0, 20*(ig+1)+50-20, 1100,700-(20*(ig+1)+50)+15, this);
                graphics.drawImage(fondo, 15, 445, 350, 245, this);
                graphics.drawImage(controles, 390, 470, this);
            }
            if (dibujarMapa) {
                int igOffset = ig;
                int jgOffset = jg;
                ig = 0;
                jg = 0;
                dibujaMapa(graphicsCanvas);
                ig += igOffset;
                jg += jgOffset;
                canvasStrategy.show();
            }
//        if (mostrarMenu) {
            ig += 2;
//            muestraMenu(g);
//        }
            if (imprimeAtaca) {
                dibujaAtaque(graphics);
            }

            if (imprimerequest) {

                dibujarequest(graphics);
            }

            if (imprimeAtacado) {
                dibujaAtacado(graphics);
            }

            if (dibujarResumenes) {
                dibujaResumen(graphics);
            }
            graphics.dispose();
            strategy.show();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        //painting = false;

    }

    @Override
    public void paint(Graphics g) {
        dibuja();
    }

    public int[] getdatos() {
        return datosMapa;
    }

    void dibujaObj(Graphics g) {
        if (cadObj != null) {
            g.drawString(cadObj, 20 * (jg) + 20, 20 * (ig + 1) + 40);
        }
        contLineasSobreMapa++;
        ig++;
    }

    public void dibujaMapa(Graphics2D g) {
        int x = this.batallonActivo.getX();
        int y = this.batallonActivo.getY();
        if (y - b > 0) {
            datosMapa[0] = 0;
            datosMapa[2] = y - b;
        } else {
            datosMapa[0] = b - y;
            datosMapa[2] = 0;
        }
        if (x - a > 0) {
            datosMapa[1] = 0;
            datosMapa[3] = x - a;
        } else {
            datosMapa[1] = a - x;
            datosMapa[3] = 0;
        }
        BufferedImage vacio = null;
        try {
            vacio = ImageIO.read(new File("vacio.png"));
        } catch (IOException ex) {
            Logger.getLogger(Ventana_principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        int inicioMapa = ig;

        for (int i = y - b; i <= y + this.b; i++) {
            for (int j = x - a; j <= x + this.a; j++) {
                //si el dibujador abarca parte que no es del mapa dibujar " "
                if (j < 0 || j >= mapa.getM() || i < 0 || i >= mapa.getN()) {
                    g.drawImage(vacio, 20 * (jg /*+ 1*/) /*+ 20*/, 20 * (ig) /*+ 50*/, this);
                } else {
                    g.drawImage(mapa.celdas[i][j].getTile(), 20 * (jg /*+ 1*/)/*+ 20*/, 20 * (ig) /*+ 50*/, this);
                    //imprimir(g, "" + mapa.celdas[i][j].getTipoTerreno());
                }
                jg++;
            }
            jg = 0;
            ig++;
        }
        ig = inicioMapa;
        for (int i = y - b; i <= y + this.b; i++) {
            for (int j = x - a; j <= x + this.a; j++) {
                if (j < 0 || j >= mapa.getM() || i < 0 || i >= mapa.getN()) {
                    g.drawImage(vacio, 20 * (jg /*+ 1*/) /*+ 20*/, 20 * (ig) /*+ 50*/, this);
                } else {
                    //imprimir(g, "" + mapa.celdas[i][j].getElementoEnCelda());
                    int xOffset = 20;//para dibujar los demas sprites en su posicion normal
                    char elem = mapa.celdas[i][j].getElementoEnCelda();
                    if (elem == 'P' || elem == 'R' || elem == 'A') {
                        xOffset = 0;
                    }
                    g.drawImage(mapa.celdas[i][j].getSprite(), 20 * (jg /*+ 1*/) /*+ 20*/, 20 * (ig - 1) /*+ 50*/ + 8 + xOffset, this);
                    //el 8 es para mover el offset del caracter
                }
                jg++;
            }
            jg = 0;
            ig++;
//            System.out.println("|");
        }
    }

    void dibujaResumen(Graphics g) {
        jg = 0;
        int[] coord = new int[2];
        coord[0] = ig;
        coord[1] = jg;
        batallonResumen.imprime_resumen(g, coord);
    }

    void dibujaAtaque(Graphics g) {
        imprimir(g, "Has atacado a los realistas");
        ig++;
    }

    void dibujaAtacado(Graphics g) {
        imprimir(g, "Has sido atacado por los realistas");
        ig++;
    }
    // Variables declaration - do not modify
    // End of variables declaration

    public int getclickX() {

        return this.clickX;
    }

    public int getclickY() {

        return this.clickY;
    }

    public void setclickX(int x) {

        this.clickX = x;
    }

    public void setclickY(int y) {

        this.clickY = y;
    }

    public void setclickDX(int x) {

        this.clickDX = x;
    }

    public void setclickDY(int y) {

        this.clickDY = y;
    }

    public Batallon elegirBatallon(char click) {
        int elegido = -1;
        int ejercito = -1;
        int xtemp;
        int ytemp;
        if (click == 'I') {
            xtemp = clickX;//se obtiene el X del batallon
            ytemp = clickY;//se obtiene el Y del batallon
        } else {
            xtemp = clickDX;//se obtiene el X del batallon
            ytemp = clickDY;
        }
        if (xtemp != -1 && ytemp != -1) {
            int[] datven = this.getdatos();
            int xdelBat = (xtemp /*- 40*/) / 20 - datven[1] + datven[3];
            int ydelBat = (ytemp /*- 50*/) / 20 - datven[0] + datven[2] /*- contLineasSobreMapa*/;
            for (int i = 0; i < 3; i++) {
                elegido = this.ejercitos.get(i).buscaBat(xdelBat, ydelBat);
                if (elegido != -1) {
                    ejercito = i;
                    break;
                }
            }

            if (elegido != -1) {
//                    System.out.println("\nEl batallon elegido fue: " + elegido + "\n");
                return ejercitos.get(ejercito).getBatallones().get(elegido);
            }
        }
        return null;
    }

    public boolean compruebaCercano(Batallon bat1, Batallon bat2) {
        int x1 = bat1.getX();
        int x2 = bat2.getX();
        int y1 = bat1.getY();
        int y2 = bat2.getY();
        double dist = Math.sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)));
        if (dist < 1.1) {
            return true;
        }
        return false;
    }

    public void impresiones_objetivos() {

        for (int i = 0; i < objetivos.size(); i++) {
            if (!objetivos.get(i).is_cumplido()) {
                objetivos.get(i).imprime_objetivo(this);
                return;
            }
        }
    }

    private void dibujarequest(Graphics g) {
        imprimir(g, this.mensaje_extra);
        ig++;
    }

    private void imprimir(Graphics g, String s) {
        g.drawString(s, 20 * (jg + 1) + 20, 20 * (ig + 1) + 50);
    }

    public void muestramensaje(String mensaje) {

        JOptionPane.showMessageDialog(null, mensaje);
    }

    public Batallon getNuevoBatActivo(Ejercito e) {
        Batallon bat = null;
        for (int i = 0; i < e.getCant_batallones(); i++) {
            if (!(e.getBatallones().get(i).isMuerto())) {
                return e.getBatallones().get(i);
            }
        }
        return bat;
    }
}
